#!/bin/bash
# Desc: Java应用启动脚本（带JVM参数优化）
# Author: fanyu
# Version: 1.0

# ------------------- 配置区（根据实际修改） -------------------
BASE_DIR="/home/deployer/app/test/server/common/data-plateform"        # 应用部署目录
APP_NAME="data-plateform-web"          # 应用名称（用于日志和进程识别）
JAR_PATH="${BASE_DIR}/${APP_NAME}.jar"     # Jar包绝对路径
LOG_DIR="${BASE_DIR}/logs"              # 日志目录
PID_FILE="${BASE_DIR}/${APP_NAME}.pid" # PID文件路径



# JVM参数配置（推荐JDK17+）
JVM_OPTS=(
  "-Xms2g"                           # 初始堆内存（建议=最大堆）
  "-Xmx2g"                           # 最大堆内存（不超过机器内存70%）
  "-Xmn1g"                           # 年轻代大小（推荐堆的1/2）
  "-XX:MetaspaceSize=256m"           # 元空间初始值
  "-XX:MaxMetaspaceSize=512m"        # 元空间最大值
  "-XX:+UseG1GC"                     # 使用G1垃圾回收器
  "-XX:MaxGCPauseMillis=200"         # 目标最大GC暂停时间(ms)
  "-XX:ParallelGCThreads=2"          # GC并行线程数（<=CPU核数）
  "-XX:ConcGCThreads=2"              # 并发GC线程数
  "-XX:+HeapDumpOnOutOfMemoryError"  # OOM时生成堆转储
  #"-XX:HeapDumpPath=${LOG_DIR}/heap_dump.hprof"  # 堆转储路径
  "-XX:+ExitOnOutOfMemoryError"      # OOM时直接退出（避免僵尸进程）
  "-Djava.security.egd=file:/dev/./urandom"  # 加速SecureRandom
  "-Dfile.encoding=UTF-8"            # 统一编码
  "-Duser.timezone=Asia/Shanghai"    # 时区设置
  #"-Dspring.profiles.active=${PROFILE}"  # Spring环境变量
)


if [ -f "${PID_FILE}" ]; then
  pid=$(cat "${PID_FILE}")
  if ps -p "${pid}" > /dev/null; then
    kill -15 "${pid}"  # 优雅终止
    sleep 5
    if ps -p "${pid}" > /dev/null; then
      kill -9 "${pid}"  # 强制终止
      echo "[WARN] Force killed ${APP_NAME} (PID: ${pid})"
    else
      echo "[INFO] Stopped ${APP_NAME} gracefully"
    fi
    rm -f "${PID_FILE}"
  else
    echo "[WARN] PID file exists but process not found"
    rm -f "${PID_FILE}"
  fi
else
  echo "[ERROR] PID file not found: ${PID_FILE}"
fi

if [ -f "${BASE_DIR}/package.tgz" ]; then
  tar -xzvf "${BASE_DIR}/package.tgz" -C "${BASE_DIR}" "./data-plateform-web.jar"
  rm -rf "${BASE_DIR}/package.tgz"
fi

echo "pwd: $(pwd)"

echo "user: $(whoami)"

cd "${BASE_DIR}"

# 启动命令
nohup "${JAVA_HOME}/bin/java" \
  "${JVM_OPTS[@]}" \
  -jar "${JAR_PATH}" \
  > "${LOG_DIR}/${APP_NAME}.out" 2>&1 &

# 记录PID
pid=$!
echo "${pid}" > "${PID_FILE}"
echo "[INFO] Started ${APP_NAME} (PID: ${pid}, JVM: ${JVM_OPTS[*]})"
exit 0